﻿Imports Newtonsoft.Json

''' <summary>
''' 对话请求体
''' </summary>
Public Class ChatRequest
    ''' <summary>
    ''' 对话的消息列表
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("messages")>
    Public Property Messages As List(Of MessagesType)

    ''' <summary>
    ''' 使用的模型的 ID。您可以使用 deepseek-chat,deepseek-reasoner
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("model"), JsonConverter(GetType(EnumJsonConverter(Of ModelEnum)))>
    Public Property Model As ModelEnum = ModelEnum.DeepseekChat

    ''' <summary>
    ''' 介于 -2.0 和 2.0 之间的数字。如果该值为正，那么新 token 会根据其在已有文本中的出现频率受到相应的惩罚，降低模型重复相同内容的可能性
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("frequency_penalty")>
    Public Property FrequencyPenalty As Single = 0

    ''' <summary>
    ''' 介于 1 到 8192 间的整数，限制一次请求中模型生成 completion 的最大 token 数。输入 token 和输出 token 的总长度受模型的上下文长度的限制。
    ''' 如未指定 max_tokens参数， 默认使用 4096。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("max_tokens")>
    Public Property MaxTokens As Integer = 4096

    ''' <summary>
    ''' 介于 -2.0 和 2.0 之间的数字。如果该值为正，那么新 token 会根据其是否已在已有文本中出现受到相应的惩罚，从而增加模型谈论新主题的可能性。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("presence_penalty")>
    Public Property PresencePenalty As Single = 0

    ''' <summary>
    ''' 一个 object，指定模型必须输出的格式。
    ''' 设置为 { "type" "json_object" } 以启用 JSON 模式，该模式保证模型生成的消息是有效的 JSON。
    ''' 注意: 使用 JSON 模式时，你还必须通过系统或用户消息指示模型生成 JSON。
    ''' 否则，模型可能会生成不断的空白字符，直到生成达到令牌限制，从而导致请求长时间运行并显得“卡住”。
    ''' 此外，如果 finish_reason="length"，这表示生成超过了 max_tokens 或对话超过了最大上下文长度，消息内容可能会被部分截断。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("response_format")>
    Public Property ResponseFormat As ResponseFormatType

    ''' <summary>
    ''' 一个 string 或最多包含 16 个 string 的 list，在遇到这些词时，API 将停止生成更多的 token。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("stop")>
    Public Property [Stop] As String()

    ''' <summary>
    ''' 如果设置为 True，将会以 SSE（server-sent events）的形式以流式发送消息增量。消息流以 data: [DONE] 结尾
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("stream")>
    Public Property Stream As Boolean = False

    ''' <summary>
    ''' 流式输出相关选项。只有在 stream 参数为 true 时，才可设置此参数。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("stream_options")>
    Public Property StreamOptions As StreamOptionsType

    ''' <summary>
    ''' 采样温度，介于 0 和 2 之间。更高的值，如 0.8，会使输出更随机，而更低的值，如 0.2，会使其更加集中和确定。 
    ''' 我们通常建议可以更改这个值或者更改 top_p，但不建议同时对两者进行修改。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("temperature")>
    Public Property Temperature As Single = 1

    ''' <summary>
    ''' 作为调节采样温度的替代方案，模型会考虑前 top_p 概率的 token 的结果。
    ''' 所以 0.1 就意味着只有包括在最高 10% 概率中的 token 会被考虑。 
    ''' 我们通常建议修改这个值或者更改 temperature，但不建议同时对两者进行修改。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("top_p")>
    Public Property TopP As Single = 1

    ''' <summary>
    ''' 是否返回所输出 token 的对数概率。如果为 true，则在 message 的 content 中返回每个输出 token 的对数概率。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("logprobs")>
    Public Property Logprobs As Boolean = False

    ''' <summary>
    ''' 一个介于 0 到 20 之间的整数 N，指定每个输出位置返回输出概率 top N 的 token，且返回这些 token 的对数概率。指定此参数时，logprobs 必须为 true。
    ''' </summary>
    ''' <returns></returns>
    <JsonProperty("top_logprobs")>
    Public Property TopLogprobs As Integer? = Nothing

    ''' <summary>
    ''' 消息类型
    ''' </summary>
    Public Class MessagesType

        ''' <summary>
        ''' 消息的内容
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("content")>
        Public Property Content As String

        ''' <summary>
        ''' 该消息的发起角色
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("role"), JsonConverter(GetType(EnumJsonConverter(Of RoleEnum)))>
        Public Property Role As RoleEnum

        ''' <summary>
        ''' 可以选填的参与者的名称，为模型提供信息以区分相同角色的参与者
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("name")>
        Public Property Name As String = Nothing

        ''' <summary>
        ''' (Beta) 设置此参数为 true，来强制模型在其回答中以此 assistant 消息中提供的前缀内容开始。
        ''' 您必须设置 base_url = "https://api.deepseek.com/beta" 来使用此功能
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("prefix")>
        Public Property Prefix As Boolean? = Nothing

        ''' <summary>
        ''' (Beta) 用于 deepseek-reasoner 模型在对话前缀续写功能下，作为最后一条 assistant 思维链内容的输入。使用此功能时，prefix 参数必须设置为 true
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("reasoning_content")>
        Public Property ReasoningContent As String = Nothing

    End Class

    ''' <summary>
    ''' 流式输出相关选项。只有在 stream 参数为 true 时，才可设置此参数
    ''' </summary>
    Public Class StreamOptionsType

        ''' <summary>
        ''' 如果设置为 true，在流式消息最后的 data: [DONE] 之前将会传输一个额外的块。
        ''' 此块上的 usage 字段显示整个请求的 token 使用统计信息，而 choices 字段将始终是一个空数组。所有其他块也将包含一个 usage 字段，但其值为 null。
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("include_usage")>
        Public Property IncludeUsage As Boolean = False

    End Class


    ''' <summary>
    ''' 输出类型
    ''' </summary>
    Public Class ResponseFormatType

        ''' <summary>
        ''' 格式类型  JsonConverter(GetType(Converters.StringEnumConverter)
        ''' </summary>
        ''' <returns></returns>
        <JsonProperty("type"), JsonConverter(GetType(EnumJsonConverter(Of FormatEnum)))>
        Public Property Type As FormatEnum = FormatEnum.JsonObject
    End Class

    ''' <summary>
    ''' 角色枚举
    ''' </summary>
    Public Enum RoleEnum
        ''' <summary>
        ''' 系统默认角色
        ''' </summary>
        <JsonProperty("system")> System = 0
        ''' <summary>
        ''' 用户角色
        ''' </summary>
        <JsonProperty("user")> User = 1
        ''' <summary>
        ''' 助手角色(多轮对话)
        ''' </summary>
        <JsonProperty("assistant")> Assistant = 2
    End Enum

    ''' <summary>
    ''' 模型枚举
    ''' </summary>
    Public Enum ModelEnum
        <JsonProperty("deepseek-chat")> DeepseekChat = 0
        <JsonProperty("deepseek-reasoner")> DeepseekReasoner = 1
    End Enum

    ''' <summary>
    ''' 输出格式
    ''' </summary>
    Public Enum FormatEnum
        <JsonProperty("text")> Text = 0
        <JsonProperty("json_object")> JsonObject = 0
    End Enum
End Class
